package la.iok.hzsvn.lewin.movie.operation.service;

import la.iok.hzsvn.lewin.movie.core.Token;
import la.iok.hzsvn.lewin.movie.operation.entity.ChargeOrder;
import la.iok.hzsvn.lewin.movie.operation.model.ChargeOrderInfo;
import la.iok.hzsvn.lewin.movie.operation.model.ChargeOrderParam;
import la.iok.hzsvn.lewin.movie.operation.model.ChargeOrderVo;
import la.iok.hzsvn.lewin.movie.operation.model.ChargePrepareRes;
import la.iok.hzsvn.lewin.mybatis.model.PageVo;
import la.iok.hzsvn.lewin.mybatis.service.BaseService;
import la.iok.hzsvn.share.annotations.NotNull;
import la.iok.hzsvn.share.annotations.Nullable;

import java.util.Date;

/**
 * 充值单服务
 */
public interface ChargeOrderService extends BaseService<ChargeOrder,Long> {
    /**
     * 下单
     * @param token 操作用户
     * @param param 订单信息
     * @return 新订单的id
     */
    ChargePrepareRes save(@NotNull Token token, @NotNull ChargeOrderParam param);

    /**
     * 关闭订单,关闭之前先查询订单状态,以免误关闭订单
     * @param id 订单id
     */
    void close(@NotNull Token token, @Nullable Long id);

    /**
     * 根据订单号更新订单状态
     * @param order 订单,包含状态，结束时间和uuid值
     */
    void update(@NotNull ChargeOrderInfo order);

    /**
     * 查询订单.如果订单未支付,则调用支付请求查询支付结果并返回。如果支付状态变更则更新支付订单状态
     * @param token 操作用户
     * @param id 订单id
     * @return 订单对象
     */
    @Nullable
    ChargeOrderVo queryWithUpdate(@NotNull Token token, @Nullable Long id);

    /**
     * 分页查询充值订单
     * @param token 操作用户
     * @param page 页号
     * @param limit 分页大小
     * @param orderColumn 排序字段
     * @param order 排序,ascending为升序,其他为降序
     * @param orgUnitId 店铺id,可能为空,为空则不过滤
     * @param roomId 房间id,可能为空,为空则不过滤
     * @return 分页内容
     */
    PageVo<ChargeOrderVo> page(@NotNull Token token, int page, int limit, @Nullable String orderColumn,
                               @Nullable String order, @Nullable Long orgUnitId,Long roomId);

    /**
     * 根据权限统计充值总额
     * @param token 操作用户
     * @param start 统计的开始时间
     * @param end 统计的结束时间
     * @return 统计的金额
     */
    int total(@NotNull Token token, @NotNull Date start, @NotNull Date end);
}
